home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / SciAn / src / examples / exampleNFF.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  124 lines

  1. /*exampleNFF.c
  2.   Example program to write an nff file
  3.  
  4.   Compile
  5.  
  6.   cc exampleNFF.c -o exampleNFF
  7.  
  8.   Eric Pepke
  9. */
  10.  
  11. #include <stdio.h>
  12.  
  13. #define FLOORMINX    -2.0    /*Min x of floor*/
  14. #define FLOORMAXX    2.0    /*Max x of floor*/
  15. #define FLOORMINY    -1.0    /*Min y of floor*/
  16. #define FLOORMAXY    1.0    /*Max y of floor*/
  17. #define FLOORZ        0.0    /*Min z of floor*/
  18.  
  19. #define BALLX        -2.0    /*Starting x of ball*/
  20. #define BALLY        0.0    /*Starting y of ball*/
  21. #define BALLZ        2.0    /*Starting z of ball*/
  22. #define BALLRADIUS    0.1    /*Radius of ball*/
  23.  
  24. #define BALLVX        1.0    /*X starting velocity of ball*/
  25. #define BALLVY        0.0    /*Y starting velocity of ball*/
  26.  
  27. #define BOUNCE        0.8    /*Bounce coefficient*/
  28.  
  29. #define AG        10.0    /*Acceleration due to gravity*/
  30.  
  31. #define TIMESTEP    0.05    /*Time step*/
  32.  
  33. void Color(FILE *file, float r, float g, float b)
  34. /*Sets to a color*/
  35. {
  36.     fprintf(file, "f %g %g %g 0 0 0 0 0\n", r, g, b);
  37. }
  38.  
  39. void DrawFloor(FILE *file)
  40. /*Draws the floor*/
  41. {
  42.     /*Color for floor*/
  43.     Color(file, 0.0, 1.0, 1.0);
  44.  
  45.     /*Now polygon*/
  46.     fprintf(file, "p 4\n");
  47.     fprintf(file, "%g %g %g\n", FLOORMINX, FLOORMINY, FLOORZ);
  48.     fprintf(file, "%g %g %g\n", FLOORMAXX, FLOORMINY, FLOORZ);
  49.     fprintf(file, "%g %g %g\n", FLOORMAXX, FLOORMAXY, FLOORZ);
  50.     fprintf(file, "%g %g %g\n", FLOORMINX, FLOORMAXY, FLOORZ);
  51. }
  52.  
  53. void DrawBall(FILE *file, float bx, float by, float bz)
  54. /*Draws the ball*/
  55. {
  56.     fprintf(file, "s %g %g %g %g\n", bx, by, bz, BALLRADIUS);
  57. }
  58.  
  59. void Time(FILE *file, float t)
  60. /*Emits a time marker*/
  61. {
  62.     fprintf(file, "t %g\n", t);
  63. }
  64.  
  65. main()
  66. {
  67.     FILE *file;
  68.     float bx, by, bz, bvx, bvy, bvz, t;
  69.  
  70.     file = fopen("example.nff", "w");
  71.     if (file)
  72.     {
  73.     /*First draw the floor*/
  74.     DrawFloor(file);
  75.  
  76.     /*Now do the simulation*/
  77.     bx = BALLX;
  78.     by = BALLY;
  79.     bz = BALLZ;
  80.     bvx = BALLVX;
  81.     bvy = BALLVY;
  82.     bvz = 0.0;
  83.     t = 0.0;
  84.  
  85.     /*Set the color once for all balls*/
  86.     Color(file, 1.0, 0.0, 0.0);
  87.  
  88.     do
  89.     {
  90.         /*Set the time step.  Omit this line to keep all snapshots
  91.           in one time step to see them all at once*/
  92.         Time(file, t);
  93.  
  94.         /*Emit the current ball position*/
  95.         DrawBall(file, bx, by, bz);
  96.  
  97.         /*Go to next time step.  I know this is really cheesy
  98.           integration, but it's just a demo.*/
  99.  
  100.         t += TIMESTEP;
  101.         bvz -= TIMESTEP * AG;
  102.  
  103.         bx += bvx * TIMESTEP;
  104.         by += bvy * TIMESTEP;
  105.         bz += bvz * TIMESTEP;
  106.  
  107.         if (bz < (FLOORZ + BALLRADIUS))
  108.         {
  109.         /*Bounce*/
  110.         bz = FLOORZ - bz + 2.0 * BALLRADIUS;
  111.         bvz = -bvz * BOUNCE;
  112.         }
  113.         
  114.     } while (bx >= FLOORMINX && bx <= FLOORMAXX && 
  115.          by >= FLOORMINY && by <= FLOORMAXY);
  116.  
  117.  
  118.     fclose(file);
  119.     }
  120.     else
  121.     {
  122.     perror("example.nff");
  123.     }
  124. }